package xymt.novaway.system.utils;

import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import lombok.extern.slf4j.Slf4j;
import xymt.novaway.common.core.utils.StringUtils;
import xymt.novaway.system.aspect.DataScopeFilter;

/**
 * 数据权限工具类
 * 
 * @author NovaWay
 * @date 2025-01-19
 */
@Slf4j
public class DataScopeUtils {
    
    /**
     * 应用数据权限过滤条件到任意类型的QueryWrapper
     * 
     * @param queryWrapper 查询包装器（LambdaQueryWrapper或QueryWrapper）
     * @param <T> 实体类型
     * @return 应用了数据权限过滤的查询包装器
     */
    public static <T> Wrapper<T> applyDataScopeFilter(Wrapper<T> queryWrapper) {
        if (DataScopeFilter.hasActiveFilter()) {
            String dataScopeSQL = DataScopeFilter.getDataScopeSQL();
            String fieldName = DataScopeFilter.getFieldName();
            
            if (StringUtils.isNotBlank(dataScopeSQL)) {
                if (queryWrapper instanceof LambdaQueryWrapper) {
                    @SuppressWarnings("unchecked")
                    LambdaQueryWrapper<T> lambdaWrapper = (LambdaQueryWrapper<T>) queryWrapper;
                    lambdaWrapper.apply(dataScopeSQL);
                    log.info("已应用数据权限过滤条件到LambdaQueryWrapper: {} (字段: {})", dataScopeSQL, fieldName);
                } else if (queryWrapper instanceof QueryWrapper) {
                    @SuppressWarnings("unchecked")
                    QueryWrapper<T> standardWrapper = (QueryWrapper<T>) queryWrapper;
                    standardWrapper.apply(dataScopeSQL);
                    log.info("已应用数据权限过滤条件到QueryWrapper: {} (字段: {})", dataScopeSQL, fieldName);
                } else {
                    log.warn("不支持的Wrapper类型: {}", queryWrapper.getClass().getSimpleName());
                }
                return queryWrapper;
            }
        }
        
        log.debug("无活跃的数据权限过滤条件");
        return queryWrapper;
    }
    
    /**
     * 应用数据权限过滤条件到LambdaQueryWrapper（保持向后兼容）
     * 
     * @param queryWrapper 查询包装器
     * @param <T> 实体类型
     * @return 应用了数据权限过滤的查询包装器
     */
    public static <T> LambdaQueryWrapper<T> applyDataScopeFilter(LambdaQueryWrapper<T> queryWrapper) {
        @SuppressWarnings("unchecked")
        LambdaQueryWrapper<T> result = (LambdaQueryWrapper<T>) applyDataScopeFilter((Wrapper<T>) queryWrapper);
        return result;
    }
    
    /**
     * 创建并应用数据权限过滤的LambdaQueryWrapper
     * 
     * @param <T> 实体类型
     * @return 带数据权限过滤的查询包装器
     */
    public static <T> LambdaQueryWrapper<T> createDataScopeWrapper() {
        return applyDataScopeFilter(new LambdaQueryWrapper<>());
    }
    
    /**
     * 检查当前是否有活跃的数据权限过滤
     * 
     * @return true-有活跃过滤，false-无活跃过滤
     */
    public static boolean hasActiveDataScopeFilter() {
        return DataScopeFilter.hasActiveFilter();
    }
    
    /**
     * 获取当前的数据权限过滤SQL
     * 
     * @return 过滤SQL，可能为null
     */
    public static String getCurrentDataScopeSQL() {
        return DataScopeFilter.getDataScopeSQL();
    }
    
    /**
     * 获取当前的数据权限过滤字段名
     * 
     * @return 字段名，可能为null
     */
    public static String getCurrentDataScopeFieldName() {
        return DataScopeFilter.getFieldName();
    }
}